#ifndef __GTKCHOICEH__
#define __GTKCHOICEH__

class wxSortedArrayString;
class wxArrayString;

//-----------------------------------------------------------------------------
// wxChoice
//-----------------------------------------------------------------------------

class wxChoice : public wxChoiceBase {
  public:
    wxChoice();
    wxChoice( wxWindow *parent, wxWindowID id,
              const wxPoint& pos = wxDefaultPosition,
              const wxSize& size = wxDefaultSize,
              int n = 0, const wxString choices[] = ( const wxString * ) NULL,
              long style = 0,
              const wxValidator& validator = wxDefaultValidator,
              const wxString& name = wxChoiceNameStr ) {
      m_strings = ( wxSortedArrayString * )NULL;
      Create( parent, id, pos, size, n, choices, style, validator, name );
    }
    wxChoice( wxWindow *parent, wxWindowID id,
              const wxPoint& pos,
              const wxSize& size,
              const wxArrayString& choices,
              long style = 0,
              const wxValidator& validator = wxDefaultValidator,
              const wxString& name = wxChoiceNameStr ) {
      m_strings = ( wxSortedArrayString * )NULL;
      Create( parent, id, pos, size, choices, style, validator, name );
    }
    virtual ~wxChoice();
    bool Create( wxWindow *parent, wxWindowID id,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 int n = 0, const wxString choices[] = ( wxString * ) NULL,
                 long style = 0,
                 const wxValidator& validator = wxDefaultValidator,
                 const wxString& name = wxChoiceNameStr );
    bool Create( wxWindow *parent, wxWindowID id,
                 const wxPoint& pos,
                 const wxSize& size,
                 const wxArrayString& choices,
                 long style = 0,
                 const wxValidator& validator = wxDefaultValidator,
                 const wxString& name = wxChoiceNameStr );

    // implement base class pure virtuals
    void Delete( unsigned int n );
    void Clear();

    int GetSelection() const;
    void SetSelection( int n );

    virtual unsigned int GetCount() const;
    virtual int FindString( const wxString& s, bool bCase = false ) const;
    virtual wxString GetString( unsigned int n ) const;
    virtual void SetString( unsigned int n, const wxString& string );

    static wxVisualAttributes
    GetClassDefaultAttributes( wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL );

  protected:
    wxList m_clientList;    // contains the client data for the items

    virtual wxSize DoGetBestSize() const;
    virtual void DoApplyWidgetStyle( GtkRcStyle *style );
    virtual GdkWindow *GTKGetWindow( wxArrayGdkWindows& windows ) const;

    virtual int DoAppend( const wxString& item );
    virtual int DoInsert( const wxString& item, unsigned int pos );

    virtual void DoSetItemClientData( unsigned int n, void* clientData );
    virtual void* DoGetItemClientData( unsigned int n ) const;
    virtual void DoSetItemClientObject( unsigned int n, wxClientData* clientData );
    virtual wxClientData* DoGetItemClientObject( unsigned int n ) const;

  private:
    // common part of Create() and DoAppend()
    int GtkAddHelper( GtkWidget *menu, unsigned int pos, const wxString& item );

    // this array is only used for controls with wxCB_SORT style, so only
    // allocate it if it's needed (hence using pointer)
    wxSortedArrayString *m_strings;

  public:
    // this circumvents a GTK+ 2.0 bug so that the selection is
    // invalidated properly
    int m_selection_hack;

  private:
    DECLARE_DYNAMIC_CLASS( wxChoice )
};


#endif // __GTKCHOICEH__
